import { createStore } from 'vuex'
import router from "@/router";

/**
 * 默认状态对象，用于存储应用的状态数据
 */
const defaultState = {
    count: 0,
    
    /**
     * 当前路由信息列表，表示当前激活的导航项
     */
    routerInfo: [{
        meta: { title: '概况' },
        name: "General",
        path: "/general",
    }],//导航菜单
    
    /**
     * 完整的路由配置列表，包含所有模块及其子路由
     */
    getRouterList: [
        {
            path: '/',
            name: 'Home',
            meta: {
                title: '员工管理',
                icon: 'HomeFilled'
            },
            children: [
                {
                    path: '/general',
                    name: 'General',
                    meta: {
                        title: '概况',
                        icon: 'Histogram'
                    },
                }, {
                    path: '/home',
                    name: 'Home',
                    meta: {
                        title: '员工信息',
                        icon: 'Avatar'
                    },
                },
            ]
        },
        {
            path: '/',
            name: 'Recruit',
            meta: {
                title: '招聘管理',
                icon: 'Promotion'
            },
            children: [
                {
                    path: '/recruit',
                    name: 'Recruit',
                    meta: {
                        title: '招聘岗位',
                        icon: 'MessageBox'
                    },
                }, {
                    path: '/apply',
                    name: 'Apply',
                    meta: {
                        title: '应聘者信息',
                        icon: 'FolderRemove'
                    },
                },
            ]
        },
        {
            path: '/',
            name: 'Clocking',
            meta: {
                title: '考勤管理',
                icon: 'Calendar'
            },
            children: [
                {
                    path: '/clocking',
                    name: 'Clocking',
                    meta: {
                        title: '考勤信息',
                        icon: 'Coin'
                    },
                }, {
                    path: '/sign',
                    name: 'Sign',
                    meta: {
                        title: '签到信息',
                        icon: 'Place'
                    },
                },
            ]
        }
    ], //左侧菜单
    
    /**
     * 导航菜单缓存列表
     */
    navList: [],//导航菜单缓存
    
    /**
     * 用户权限列表，包含用户可访问的所有路由名称
     */
    authList: ['Home', 'Recruit', 'Apply', 'General', 'Clocking', 'Sign'] , //登录鉴权
    
    /**
     * 当前登录用户信息
     */
    currentUser: null,

    /**
     * 根据权限列表过滤路由的方法
     * @param routes - 需要过滤的路由数组
     * @param authList - 权限列表
     * @returns 过滤后的路由数组
     */
    filterRoutesByAuth(routes, authList){
        return routes.filter(route => {
            if (route.children){
                route.children = this.filterRoutesByAuth(route.children, authList)
                return route.children.length > 0
            }
            return authList.includes(route.name)
        })
    }
}

/**
 * 递归处理路由数据的方法
 * @param data - 路由数据数组
 * @returns 处理后的路由数据数组
 */
const permission = (data) => {
    data.forEach(item => {
        if (item.children) {
            item.children = permission(item.children)
        }
    })
    return data
}

/**
 * 创建Vuex Store实例
 */
export default createStore({

    /**
     * 状态初始化函数
     * @returns 初始状态对象
     */
    state() {
        return defaultState
    },

    /**
     * 同步修改状态的方法集合
     */
    mutations: {
        /**
         * 更新路由信息列表
         * @param state - 状态对象
         * @param routeList - 新的路由信息列表
         */
        increment(state: typeof defaultState, routeList) {
            state.routerInfo = routeList
            localStorage.setItem("navList", JSON.stringify(state.routerInfo))
        },

        /**
         * 添加新的路由信息到路由信息列表中，并去重
         * @param state - 状态对象
         * @param router - 要添加的路由信息
         */
        getRouterInfo(state: typeof defaultState, router) {
            state.routerInfo.push(router)
            let newobj = {};
            state.routerInfo = state.routerInfo.reduce((preVal, curVal) => {
                newobj[curVal.name] ? '' : newobj[curVal.name] = preVal.push(curVal);
                return preVal
            }, [])
            localStorage.setItem("navList", JSON.stringify(state.routerInfo))
        },

        /**
         * 获取并处理完整的路由列表
         * @param state - 状态对象
         */
        getRouter(state:  typeof defaultState) {
            let data = permission(state.getRouterList)
            state.navList = data
        },

        /**
         * 设置当前用户信息
         * @param state - 状态对象
         * @param user - 用户信息对象
         */
        setUser(state: typeof defaultState, user) {
            state.currentUser = user
        },

        /**
         * 根据用户权限更新导航菜单列表
         * @param state - 状态对象
         */
        updateNavListByAuth(state: typeof defaultState){
            try {
                const filterRoutes = state.filterRoutesByAuth(
                    JSON.parse(JSON.stringify(state.navList)),
                    state.authList
                );
                state.navList = filterRoutes
            } catch (error){
                console.log('权限过滤错误:',error)
                state.navList = []
            }

        }
    },

    /**
     * 异步操作方法集合
     */
    actions: {
        /**
         * 获取路由列表并根据权限进行过滤
         * @param context - Vuex上下文对象
         */
        getrouterList(context) {
            context.commit("getRouter")
            context.commit("updateNavListByAuth")
        },

        /**
         * 更新路由信息列表
         * @param context - Vuex上下文对象
         * @param routeList - 新的路由信息列表
         */
        increment(context, routeList) {
            context.commit('increment', routeList)
        },

        /**
         * 添加路由信息到路由信息列表
         * @param context - Vuex上下文对象
         * @param router - 要添加的路由信息
         */
        getRouterInfo(context, router) {
            context.commit('getRouterInfo', router)
        },

        /**
         * 用户登录操作
         * @param context - Vuex上下文对象
         * @param userInfo - 用户信息对象
         */
        login(context, userInfo) {
            context.commit('setUser', userInfo)
        },
    },

    /**
     * 计算属性方法集合
     */
    getters: {
    }
})
